/* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*
* AION - sterownik czasowo temperaturowy
* http://code.google.com/p/aions
*
* Copyright (C) 2014 Piotr Murawski
*
* Niniejszy program jest wolnym oprogramowaniem; mozesz go
* rozprowadzac dalej i/lub modyfikowac na warunkach Powszechnej
* Licencji Publicznej GNU, wydanej przez Fundacje Wolnego
* Oprogramowania - wedlug wersji 3-ciej tej Licencji lub którejs
* z pozniejszych wersji.
*
* Autor, NIE UDZIELA zgody na wykorzystanie, calosci lub jakiej
* kolwiek czesci niniejszego oprogramowania, czy to w postaci
* kodu zrodlowego czy tez, bibliotek, plikow wykonywalnych czy tez
* innej formy pochodnej plikow zrodlowych do CELOW KOMERCYJNYCH.
*
* Niniejszy program rozpowszechniany jest z nadzieja iz bedzie on
* uzyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyslnej
* gwarancji PRZYDATNOSCI HANDLOWEJ albo PRZYDATNOSCI DO OKRESLONYCH
* ZASTOSOWAN. W celu uzyskania blizszych informacji - Powszechna
* Licencja Publiczna GNU.
*
* Z pewnoscia wraz z niniejszym programem otrzymales tez egzemplarz
* Powszechnej Licencji Publicznej GNU (GNU General Public License);
* jesli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave,
* Cambridge, MA 02139, USA.
*
* Powszechna Licencja GNU znajduje sie w zalaczonym pliku:
* Licencja.txt
*
* Powszechna Licencja GNU dostepna jest rowniez na stronie:
* http://www.gnu.org/licenses/licenses.html
*
* nieoficjalne polskie tlumaczenie na
* http://www.gnu.org.pl
*
* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*
* AION - time temperature controller
* http://code.google.com/p/aions
*
* Copyright (C) 2014 Piotr Murawski
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Autor, doea not allow to use this software, as whole or in parts, in form 
* of source code or compiled code for COMMERCIAL USE.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/

.set Mode_USR, 0x10
.set Mode_FIQ, 0x11
.set Mode_IRQ, 0x12
.set Mode_SVC, 0x13
.set Mode_ABT, 0x17
.set Mode_UND, 0x1B
.set Mode_SYS, 0x1F
.set I_Bit, 0x80
.set F_Bit, 0x40


.set EXCEPTION_UNDEF,    1
.set EXCEPTION_PREFABT,  2
.set EXCEPTION_DATAABT,  3

        .globl EXC_Undef
        .globl EXC_PrefAbt
        .globl EXC_DataAbt

        .extern EXCP_Handler

	.text
.section EXCEPTIONS,"ax"
	.code 32
	.align  0

/*============================================================================
; Exception handling routine, stores regieters onto the stack and passes
; some information to the C exception handler
;
; Stack content:
;     0         4        8        C
;     ------------------------------
; 00  lr_curr  r12      r11       r10
; 10  r9       r8       r7        r6
; 20  r5       r4       r3        r2
; 30  r1       r0       SPSR_curr r12_fiq
; 40  r11_fiq  r10_fiq  r9_fiq    r8_fiq
; 50  sp_fiq   sp_svc   sp_sys    sp_irq
;
;============================================================================*/


//===========================
// Undefinded exception
//===========================
EXC_Undef:
        // store working registers
        STMFD  sp!,{r0-r12,lr}
        MOV    r7,#EXCEPTION_UNDEF
        B      EXC_Common

//===========================
// Prefetch Abort
//===========================
EXC_PrefAbt:
        // store working registers
        STMFD  sp!,{r0-r12,lr}
        MOV    r7,#EXCEPTION_PREFABT
        B      EXC_Common

//===========================
// Data Abort
//===========================
EXC_DataAbt:
        // store working registers
        STMFD  sp!,{r0-r12,lr}
        MOV    r7,#EXCEPTION_DATAABT

//===========================
// Common exception handler
//===========================
EXC_Common:
       MRS    r5,CPSR

       // read and store SPSR
       MRS    r6,SPSR
       STMFD  sp!,{r6}

       // storing FIQ upper registers on the stack
       MOV    r0,sp
       //switch to FIQ for a while and store some registers
       MSR    CPSR_c, #Mode_FIQ|I_Bit|F_Bit
       STMFD  r0!,{r8-r12,sp,lr}

       //switch to SVC for a while and store some registers
       MSR    CPSR_c, #Mode_SVC|I_Bit|F_Bit
       STMFD  r0!,{sp,lr}

       //switch to SYS for a while and store some registers
       MSR    CPSR_c, #Mode_SYS|I_Bit|F_Bit
       STMFD  r0!,{sp,lr}

       //switch to IRQ for a while and store some registers
       MSR    CPSR_c, #Mode_IRQ|I_Bit|F_Bit
       STMFD  r0!,{sp,lr}

       MSR    CPSR_c,r5

       // restore stack pointer
       MOV    sp,r0

       MOV    r1,r6
       MOV    r2,r7
       // jump to C code rutine
       // r0 - current stack pointer
       // r1 - SPSR
       // r2 - excpetion ID
       B      EXCP_Handler






